package com.jvm.bytecode;

/*
    方法的动态分派：
        方法的动态分派涉及到一个重要概念：方法接收者
        invokevirtual字节码指令的一个多态查找流程：
            1.从操作数栈顶的第一个元素所指向对象的实际类型
            2.如果从常量池中查找到了与当前确定的静态类型有一样的方法名称和方法描述符则直接调用和返回
            3.如果没找到，则从实际类型从下至上（子类到父类）去查找对应的方法
        比较方法重载(overload) 与方法重写(overwrite)。我们可以得到这样一个结论：
        方法重载是静态的，是编译期行为;方法重写是动态的，是运行期行为。
        其实就是看谁调用的这个方法，以此判断是否静态/动态。
 */
public class MyTest6 {
    public static void main(String[] args) {
        Fruit apple = new Apple();
        Fruit orange = new Orange();

        apple.test();
        orange.test();

        apple = new Orange();
        apple.test();
    }
}

class Fruit {
    public void test(){
        System.out.println("fruit");
    }
}

class Apple extends Fruit{

    @Override
    public void test(){
        System.out.println("apple");
    }
}

class Orange extends Fruit{

    @Override
    public void test(){
        System.out.println("orange");
    }
}